package com.gbas.comu.service;

import com.gbas.comu.dao.DaoService;
import com.gbas.comu.model.*;
import com.gbas.comu.util.Util;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JugadorService {
    static int jugadorCount = 1;
    static Map<Futbolista.PosicionFutbolista, Integer> maximosPosicion = new HashMap<Futbolista.PosicionFutbolista, Integer>();

    static {
        maximosPosicion.put(Futbolista.PosicionFutbolista.PORTERO, 3);
        maximosPosicion.put(Futbolista.PosicionFutbolista.DEFENSA, 6);
        maximosPosicion.put(Futbolista.PosicionFutbolista.CENTROCAMPISTA, 4);
        maximosPosicion.put(Futbolista.PosicionFutbolista.DELANTERO, 3);
    }


    public static Jugador altaJugador() {
        return null;
    }
    public static void bajaJugador(Jugador jugador) {

    }

    public static void createJugador() {
        final List<Liga> ligas = DaoService.getLigaDAO().findAll();
        if (ligas.size() > 0) {
            Jugador jugador = new Jugador();
            final Liga liga = ligas.get(0);
            jugador.setLiga(liga);
            jugador.setEmail("test@mail.com");
            jugador.setEuros(20000);
            jugador.setPassword("test");
            jugador.setPuntos(0);
            jugador.setNombre("Jugador " + jugadorCount++);
            jugador.setNombreEquipo("Equipo de jugador " + jugador.getNombre());

            // Reparto de futbolistas
            for (Map.Entry<Futbolista.PosicionFutbolista, Integer> posicionFutbolistaIntegerEntry : maximosPosicion.entrySet()) {
                for (int k = 0; k < posicionFutbolistaIntegerEntry.getValue(); k++) {
                    final Futbolista futbolista = DaoService.getFutbolistaDAO().findLibreByPos(posicionFutbolistaIntegerEntry.getKey(), liga);
                    if (futbolista != null) {
                        jugador.addFutbolista(futbolista);
                        liga.removeFutbolista(futbolista);
                    }
                }
            }

            jugador=DaoService.getJugadorDAO().saveCommit(jugador);


            final Jornada nextJornada = liga.getNextJornada();

            Alineacion alineacion=new Alineacion();
            alineacion.setJornada(nextJornada);
            final Tactica tacticaSelected = Tactica.values()[Util.rd.nextInt(Tactica.values().length)];
            alineacion.setTactica(tacticaSelected);
            alineacion.setJugador(jugador);
        }
    }

    public static void recalculaPuntos() {
        final List<Jugador> jugadorList = DaoService.getJugadorDAO().findAll();
        for (Jugador jugador : jugadorList) {
            int puntos=0;
            for (Futbolista futbolista : jugador.getFutbolistas()) {
                puntos += futbolista.getPuntuacionActual();
            }
            jugador.setPuntos(puntos);
            DaoService.getJugadorDAO().saveCommit(jugador);
        }
    }
}
